'use strict';

/**
 * 微信异常
 */
class WxError extends Error {

    /**
     * @type {number}
     */
    code;
    /**
     * 小程序的异常
     * @type [WxError]
     */
    static err = [
        new WxError(-1, '系统繁忙，此时请开发者稍候再试'),
        new WxError(1, '加密数据不存在，数据生成的时间超过保存的限制（3天）或者key不存在'),

        new WxError(40001, 'AppSecret 错误或者 AppSecret 不属于这个小程序，请开发者确认 AppSecret 的正确性'),
        new WxError(40002, '请确保 grant_type 字段值为 client_credential'),
        new WxError(40003, 'openid 错误'),
        new WxError(40013, '请确保 grant_type 字段值为 client_credential'),
        new WxError(40029, 'code 无效'),
        new WxError(40226, '高风险等级用户，小程序登录拦截 。风险等级详见用户安全解方案'),
        new WxError(40097, '请求里的encrypted_msg_hash参数无效'),

        new WxError(44002, '传入的数据为空'),

        new WxError(45011, '频率限制，每个用户每分钟100次'),

        new WxError(47001, '传入的数据格式错误'),
        new WxError(89002, '没有绑定开放平台帐号'),
        new WxError(89300, '订单无效')
    ]

    /**
     *
     * @param code
     * @param message
     */
    constructor(code, message) {
        super(message);
        this.message = message;
        this.name = 'WxError';
        this.code = code;
    }

    /**
     * 抛出miniapp的异常
     * @param code {number}
     * @param errMsg {string}
     */
    static throwsErr(code, errMsg) {
        // 可恶!!! 成功时候 errcode并不存在 所以当errcode存在并且为0的时候不执行
        if (undefined === code || 0 === code) return;
        for (let err of this.err) {
            //抛出异常
            if (code === err.code) {
                throw err;
            }
        }
        //其他未知异常
        throw new WxError(code, '未知异常:' + errMsg);


    }
}

module.exports = WxError;
